;void recortar_asm (
;	unsigned char *src, RDI
;	unsigned char *dst, RSI
;	int m, EDX
;	int n, ECX
;	int src_row_size, R8D
;	int dst_row_size, R9D
;	int x,	[RSP+8]
;	int y, [RSP+16]
;	int tam [RSP+24]
;);

global recortar_asm

recortar_asm:
	mov rax, rsp
	push rbp
	mov rbp, rsp
	push rbx
	push r12
	push r13
	push r14
	push r15
	
	xor r12, r12 	;Contador filas
	xor r14, r14
	xor r15, r15
	mov r14d, [rax+8] 	; x
	mov r15d, [rax+16] 	; y
 		
.cicloFilas:	
	xor r13, r13	;Contador columnas

.cicloColumnas:		
	mov rbx, r12 	; j
	add rbx, r15 	; j+y
	imul ebx, r8d	; (j+y)*src_row_size
	add rbx, r14	; (j+y)*src_row_size + x
	add rbx, r13	; sumamos 16
	
	movdqu xmm0, [rdi+rbx] ; copiamos 16 pixeles de la imagen original a xmm0.
	
	; calculamos la posicion de la imagen destino donde copiar los pixeles.
	mov rbx, r12
	imul ebx, r9d
	add rbx, r13
	
	movdqu [rsi+rbx], xmm0 ; copiamos los 16 pixeles de xmm0 a la imagen destino.
	
.avanzarColumnas:
	add r13, 16 ; avanzamos a las proximas 16 columnas
	cmp r13d, [rax+24]
	je .avanzarFila
	.cuantoAtras:
	lea r10, [r13+16]
	cmp r10d, [rax+24]	;Si es menor o igual nos quedan por lo menos 16 columnas por copiar
	jle .cicloColumnas
	sub r13, 1
	jmp .cuantoAtras	;Con el ciclo calculamos cuanto tenemos que ir para atras para agarrar justo 16
		
.avanzarFila:
	add r12, 1	; vamos a la siguiente fila
	cmp r12d, [rax+24]	
	jl .cicloFilas ; nos quedan filas por recortar
	
	
.fin:
	pop r15
	pop r14
	pop r13
	pop r12
	pop rbx
	pop rbp
	ret
